import qs from 'qs'
import { isFunction } from '@/js/utils'

const URL_PREFIX = '/api'
const  MS_API_URL_PREFIX = '/msApi'
//文件服务器node
const  NODE_API_URL_PREFIX = '/nodeApi'



/**
 *
 * @description 解析url，处理 /:id 格式
 * @param {*} url
 * @param {*} data
 */
function parseUrl(url, data) {
  var arr = url.split('/')
  for (var i in arr) {
    var it = arr[i]
    if (it.indexOf(':') === 0) {
      arr[i] = data['_' + it.slice(1)]
    }
  }
  return arr.join('/')
}

/**
 * @description 处理url，添加前缀等
 * @param {*} url
 * @param {*} data
 * @param {*} msApi 是否是微服务
 */
function buildUrl(url, data,options) {
  if (!url) {
    console.error('请设置请求url')
    return '/'
  }
  if(options != undefined && options.nodeApi){
    return  NODE_API_URL_PREFIX + parseUrl(url, data);
  }else if (options != undefined && options.msApi){
    return  MS_API_URL_PREFIX + parseUrl(url, data);
  } else{
    return URL_PREFIX + parseUrl(url, data);
  }

  // if(!msApi){
  //   return URL_PREFIX + parseUrl(url, data)
  // }else if(!NODE_API_URL_PREFIX){
  //   return URL_PREFIX + parseUrl(url, data)
  // }else{
  //   return MS_API_URL_PREFIX + parseUrl(url, data);
  // }

}

/**
 *
 * @description 发送请求
 * @param {*} api
 * @param {*} data
 * @param {
 *      data: 请求参数
 *      isJson: 参数用 json 传递
 *      closeToast: 关闭 Toast 动画
 *      success: 成功回调
 *      fail: 失败回调
 *      failOk： 失败弹窗 ok 回调
 *      quiesce:静默模式，不会有弹框等提示
 *    } options
 */
function ajax(api, options = {}) {
  var url = buildUrl(api.url, options.data,options)
  var data = options.isJson ? options.data : qs.stringify(options.data)

  if (!options.closeToast&&!options.quiesce) {
    Vue.prototype.$Toast.start()
  }
  if (api.method.toLowerCase() == 'get') {
    url += '?rd=' + Math.floor(Math.random() * 1000) // 去 get 方法缓存
  }
  if (process.env.NODE_ENV !== 'production') {
    console.log('url: ', url)
    console.log('data: ', JSON.stringify(data))
  }
  var config = {url,method:api.method||"post"};
  if(config.method.toLowerCase()=="get"){
    config.params = data;
  }else{
    config.data = data;
  }
  axios(config)
    .then(res => {
      //登录信息失效
      if(res.data.code == -1013){
        location.reload()
        return;
      }
      if (!options.closeToast&&!options.quiesce) {
        Vue.prototype.$Toast.finish()
      }

      parseResponse(res, options)
    })
    .catch(e => {
      if (!options.closeToast&&!options.quiesce) {
        Vue.prototype.$Toast.finish()
      }
      if(!options.quiesce){
        Vue.prototype.$Modal.info({
          html:'<div style="display: flex;flex-direction: column;align-items: center;justify-content: center;padding: 1rem 0.5rem 0rem;">' +
          '<div style="color: #666;text-align: center;font-size: 0.32rem;line-height: 0.48rem">'+(e.response.data.message || e.message)+'</div>'+
          '</div>',
          showTitle:false,
          okText:'知道了',
          width:"6rem",
          closeable:false,
          okStyle: {
            color: '#fff',
            cursor: "pointer",
            height: '0.9rem',
            lineHeight: '0.9rem',
            marginTop: '0.3rem;',
            fontSize: '0.32rem',
            width:'4rem',
            background: '#00caf8',
            border: '1px solid #00caf8',
            marginBottom:'0.1rem'
          },
          onOk:()=> {
            isFunction(options.errorOk)&&options.errorOk(e);
          }
        })
      }
      isFunction(options.error)&&options.error(e);
      console.error(e)
    })
}

/**
 *
 * @description 处理响应，错误弹窗和callback调用
 * @param {*} res
 * @param {*} options
 */
function parseResponse(res, options) {
  const data = res.data
  if (data.code != 200) {
    if(!options.quiesce){
      Vue.prototype.$Modal.info({
        html:'<div style="display: flex;flex-direction: column;align-items: center;justify-content: center;padding: 1rem 0.5rem 0rem;">' +
        '<div style="color: #666;text-align: center;font-size: 0.32rem;line-height: 0.48rem">'+(data.message || data.code)+'</div>'+
        '</div>',
        showTitle:false,
        okText:'知道了',
        closeable:false,
        width:"6rem",
        okStyle: {
          color: '#fff',
          cursor: "pointer",
          height: '0.9rem',
          lineHeight: '0.9rem',
          marginTop: '0.3rem;',
          fontSize: '0.32rem',
          width:'4rem',
          background: '#00caf8',
          border: '1px solid #00caf8',
          marginBottom:'0.1rem'
        },
        onOk:()=> {
          isFunction(options.failOk) && options.failOk(data)
        }
      })
    }
    isFunction(options.fail) && options.fail(data)
    return
  }
  isFunction(options.success) && options.success(data.data)
}

export default ajax
